NexusPi Git Node
lib/microReticulum/src/Cryptography/X25519.h copilot/add-rtnode-configuration-options (9529fa8a) Text, 5.33 KB
Tff7b72#Tff7b72pragma once
Tff7b72#Tff7b72include T8b949e"Bytes.h"
Tff7b72#Tff7b72include T8b949e"Log.h"
Tff7b72#Tff7b72include T8b949e<Curve25519.h>
Tff7b72#Tff7b72include T8b949e<memory>
Tff7b72#Tff7b72include T8b949e<stdexcept>
Tff7b72#Tff7b72include T8b949e<stdint.h>
Te6edf3namespace Te6edf3RNS Tb4b4b4{ Te6edf3namespace Te6edf3Cryptography Tb4b4b4{
Te6edf3class Te6edf3X25519PublicKey Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3using Te6edf3Ptr Tff7b72= Te6edf3stdTff7b72:Tff7b72:Te6edf3shared_ptrTff7b72<Te6edf3X25519PublicKeyTff7b72>Tb4b4b4;
Te6edf3publicTff7b72:
T8b949e/*
X25519PublicKey(const Bytes& x) {
_x = x;
}
*/
Te6edf3X25519PublicKeyTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3publicKeyTb4b4b4) Tb4b4b4{
Te6edf3_publicKey Tff7b72= Te6edf3publicKeyTb4b4b4;
Tb4b4b4}
Tff7b72~Te6edf3X25519PublicKeyTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
Te6edf3publicTff7b72:
T8b949e// creates a new instance with specified seed
T8b949e/*
static inline Ptr from_public_bytes(const Bytes& data) {
return Ptr(new X25519PublicKey(_unpack_number(data)));
}
*/
Tff7b72static Tff7b72inline Te6edf3Ptr Te6edf3from_public_bytesTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3publicKeyTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3PtrTb4b4b4(Te6edf3new Te6edf3X25519PublicKeyTb4b4b4(Te6edf3publicKeyTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/*
Bytes public_bytes() {
return _pack_number(_x);
}
*/
Te6edf3Bytes Te6edf3public_bytesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3_publicKeyTb4b4b4;
Tb4b4b4}
Te6edf3privateTff7b72:
T8b949e//Bytes _x;
Te6edf3Bytes Te6edf3_publicKeyTb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3class Te6edf3X25519PrivateKey Tb4b4b4{
Te6edf3publicTff7b72:
Tff7b72const Tffa657float Te6edf3MIN_EXEC_TIME Tff7b72= T79c0ff2Tb4b4b4; T8b949e// in milliseconds
Tff7b72const Tffa657float Te6edf3MAX_EXEC_TIME Tff7b72= T79c0ff500Tb4b4b4; T8b949e// in milliseconds
Tff7b72const Tffa657uint8_t Te6edf3DELAY_WINDOW Tff7b72= T79c0ff10Tb4b4b4;
T8b949e//z T_CLEAR = None
Tff7b72const Tffa657uint8_t Te6edf3T_MAX Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3using Te6edf3Ptr Tff7b72= Te6edf3stdTff7b72:Tff7b72:Te6edf3shared_ptrTff7b72<Te6edf3X25519PrivateKeyTff7b72>Tb4b4b4;
Te6edf3publicTff7b72:
T8b949e/*
X25519PrivateKey(const Bytes& a) {
_a = a;
}
*/
Te6edf3X25519PrivateKeyTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3privateKeyTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3privateKeyTb4b4b4) Tb4b4b4{
T8b949e// use specified private key
Te6edf3_privateKey Tff7b72= Te6edf3privateKeyTb4b4b4;
T8b949e// similar to derive public key from private key
T8b949e// second param "f" is secret
T8b949e//eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
T8b949e// derive public key from private key
Te6edf3Curve25519Tff7b72:Tff7b72:Te6edf3evalTb4b4b4(Te6edf3_publicKeyTb4b4b4.Te6edf3writableTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4, Te6edf3_privateKeyTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
T8b949e// create random private key and derive public key
T8b949e// second param "f" is secret
T8b949e//dh1(uint8_t k[32], uint8_t f[32])
Te6edf3Curve25519Tff7b72:Tff7b72:Te6edf3dh1Tb4b4b4(Te6edf3_publicKeyTb4b4b4.Te6edf3writableTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4, Te6edf3_privateKeyTb4b4b4.Te6edf3writableTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72~Te6edf3X25519PrivateKeyTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
Te6edf3publicTff7b72:
T8b949e// creates a new instance with a random seed
T8b949e/*
static inline Ptr generate() {
return from_private_bytes(os.urandom(32));
}
*/
Tff7b72static Tff7b72inline Te6edf3Ptr Te6edf3generateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3from_private_bytesTb4b4b4(Tb4b4b4{Te6edf3BytesTff7b72:Tff7b72:Te6edf3NONETb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// creates a new instance with specified seed
T8b949e/*
static inline Ptr from_private_bytes(const Bytes& data) {
return Ptr(new X25519PrivateKey(_fix_secret(_unpack_number(data))));
}
*/
Tff7b72static Tff7b72inline Te6edf3Ptr Te6edf3from_private_bytesTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3privateKeyTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3PtrTb4b4b4(Te6edf3new Te6edf3X25519PrivateKeyTb4b4b4(Te6edf3privateKeyTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/*
inline const Bytes private_bytes() {
return _pack_number(_a);
}
*/
Tff7b72inline Tff7b72const Te6edf3BytesTff7b72& Te6edf3private_bytesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3_privateKeyTb4b4b4;
Tb4b4b4}
T8b949e// creates a new instance of public key for this private key
T8b949e/*
inline X25519PublicKey::Ptr public_key() {
return X25519PublicKey::from_public_bytes(_pack_number(_raw_curve25519(9, _a)));
}
*/
Tff7b72inline Te6edf3X25519PublicKeyTff7b72:Tff7b72:Te6edf3Ptr Te6edf3public_keyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3X25519PublicKeyTff7b72:Tff7b72:Te6edf3from_public_bytesTb4b4b4(Te6edf3_publicKeyTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/*
inline const Bytes exchange(const Bytes& peer_public_key) {
if isinstance(peer_public_key, bytes):
peer_public_key = X25519PublicKey.from_public_bytes(peer_public_key)
start = OS::time()
shared = _pack_number(_raw_curve25519(peer_public_key.x, _a))
end = OS::time()
duration = end-start
if X25519PrivateKey.T_CLEAR == None:
X25519PrivateKey.T_CLEAR = end + X25519PrivateKey.DELAY_WINDOW
if end > X25519PrivateKey.T_CLEAR:
X25519PrivateKey.T_CLEAR = end + X25519PrivateKey.DELAY_WINDOW
X25519PrivateKey.T_MAX = 0
if duration < X25519PrivateKey.T_MAX or duration < X25519PrivateKey.MIN_EXEC_TIME:
target = start+X25519PrivateKey.T_MAX
if target > start+X25519PrivateKey.MAX_EXEC_TIME:
target = start+X25519PrivateKey.MAX_EXEC_TIME
if target < start+X25519PrivateKey.MIN_EXEC_TIME:
target = start+X25519PrivateKey.MIN_EXEC_TIME
try:
OS::sleep(target-OS::time())
except Exception as e:
pass
elif duration > X25519PrivateKey.T_MAX:
X25519PrivateKey.T_MAX = duration
return shared
}
*/
Tff7b72inline Tff7b72const Te6edf3Bytes Te6edf3exchangeTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3peer_public_keyTb4b4b4) Tb4b4b4{
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: public key: Ta5d6ff" Tff7b72+ Te6edf3_publicKeyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: peer public key: Ta5d6ff" Tff7b72+ Te6edf3peer_public_keyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: pre private key: Ta5d6ff" Tff7b72+ Te6edf3_privateKeyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3Bytes Te6edf3sharedKeyTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3Curve25519Tff7b72:Tff7b72:Te6edf3evalTb4b4b4(Te6edf3sharedKeyTb4b4b4.Te6edf3writableTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4, Te6edf3_privateKeyTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3peer_public_keyTb4b4b4.Te6edf3dataTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3throw Te6edf3stdTff7b72:Tff7b72:Te6edf3runtime_errorTb4b4b4(Ta5d6ff"Ta5d6ffPeer key is invalidTa5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: shared key: Ta5d6ff" Tff7b72+ Te6edf3sharedKeyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: post private key: Ta5d6ff" Tff7b72+ Te6edf3_privateKeyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3sharedKeyTb4b4b4;
Tb4b4b4}
Tff7b72inline Tffa657bool Te6edf3verifyTb4b4b4(Tff7b72const Te6edf3BytesTff7b72& Te6edf3peer_public_keyTb4b4b4) Tb4b4b4{
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: public key: Ta5d6ff" Tff7b72+ Te6edf3_publicKeyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: peer public key: Ta5d6ff" Tff7b72+ Te6edf3peer_public_keyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: pre private key: Ta5d6ff" Tff7b72+ Te6edf3_privateKeyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3Bytes Td2a8ffsharedKeyTb4b4b4(Te6edf3peer_public_keyTb4b4b4)Tb4b4b4;
Tffa657bool Te6edf3success Tff7b72= Te6edf3Curve25519Tff7b72:Tff7b72:Te6edf3dh2Tb4b4b4(Te6edf3sharedKeyTb4b4b4.Te6edf3writableTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4, Te6edf3_privateKeyTb4b4b4.Te6edf3writableTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: shared key: Ta5d6ff" Tff7b72+ Te6edf3sharedKeyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3DEBUGTb4b4b4(Ta5d6ff"Ta5d6ffX25519PublicKey::exchange: post private key: Ta5d6ff" Tff7b72+ Te6edf3_privateKeyTb4b4b4.Te6edf3toHexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3successTb4b4b4;
Tb4b4b4}
Te6edf3privateTff7b72:
T8b949e//Bytes _a;
Te6edf3Bytes Te6edf3_privateKeyTb4b4b4;
Te6edf3Bytes Te6edf3_publicKeyTb4b4b4;
Tb4b4b4}Tb4b4b4;
Tb4b4b4} Tb4b4b4}
Served by rngit 1.4.2 - Generated in 0.02s